// #include<iostream>
// using namespace std;
// const int maxn=3001;
// int n,m,maxans=0;
// int vis[maxn],ans[maxn],con[maxn][maxn];
// bool check(int x)
// {
//     for(int i=1;i<x;i++)
//     if(vis[i]&&!con[x][i])
//     return false;
//     return true;
// }
// int main()
// {
//     cin>>n>>m;
//     int x,y;
//     for(int i=1;i<=m;i++)
//     {
//         cin>>x>>y;
//         con[x][y]=con[y][x]=1;
//     }
//     int k=1,cnt=0;
//     while(1)
//     {
//         int f=0;
//         vis[k]=1;
//         while(k<=n&&check(k))  //进入左子树
//         {
//             cnt++;k++;
//             vis[k]=1;
//         }
//         // cout<<cnt<<"*"<<k<<" ";
//         if(k>n)    //到达叶节点记录最优解
//         {
//             for(int i=1;i<=n;i++)
//             ans[i]=vis[i];
//             maxans=max(maxans,cnt);
//         }
//         else{    //进入右子树
//             vis[k]=0;
//             k++;
//         }
//         while(cnt+n-k+1<=maxans) //设置上界进行剪枝
//         {
//             k--;
//             while(k>0&&!vis[k]) k--;       //回溯
//             if(k==0) {
//                 f=1;
//                 break;        //已求出所有解,无其他解
//             }
//             vis[k]=0;         //回溯,删除已选择的点,进入右子树
//             cnt--;
//             k++;
//         }
//         if(f) break;
//     }
//     cout<<"MCP number:"<<maxans<<endl;
//     cout<<"MCP V:";
//     for(int i=1;i<=n;i++)
//     if(ans[i]) cout<<i<<" ";
// }

// // 5 7
// // 1 2
// // 2 3
// // 1 4
// // 4 5
// // 1 5
// // 2 5
// // 3 5
#include<iostream>
using namespace std;
const int maxn=3001;
int n,m,maxans=0;
int vis[maxn],ans[maxn],con[maxn][maxn];
bool check(int x)
{
    for(int i=1;i<x;i++)
    if(vis[i]&&!con[x][i])
    return false;
    return true;
}
int main()
{
    cin>>n>>m;
    int x,y;
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y;
        con[x][y]=con[y][x]=1;
    }
    int k=1,cnt=0;
    while(1)
    {
        int f=0;
        while(k<=n&&check(k))  //进入左子树
        {
            vis[k]=1;
            cnt++;k++;
        }
        if(k>n)    //到达叶节点记录最优解
        {
            for(int i=1;i<=n;i++)
            ans[i]=vis[i];
            maxans=max(maxans,cnt);
        }
        else{    //进入右子树
            vis[k]=0;
            k++;
        }
        while(cnt+n-k+1<=maxans) //设置上界进行剪枝
        {
            while(k>0&&!vis[k]) k--;       //回溯
            if(k==0) {
                f=1;break;        //已求出所有解,无其他解
            }
            vis[k]=0;         //回溯,删除已选择的点,进入右子树
            cnt--;
            k++;
        }
        if(f) break;
    }
    cout<<"MCP number:"<<maxans<<endl;
    cout<<"MCP V:";
    for(int i=1;i<=n;i++)
    if(ans[i]) cout<<i<<" ";
}
// 5 7
// 1 2
// 2 3
// 1 4
// 4 5
// 1 5
// 2 5
// 3 5